/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import Facade.Facade;
import Objetos.Conta;
import Objetos.Usuario;
import Objetos.ValoresFixos;
import com.toedter.calendar.JDateChooser;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.ParseException;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author celio
 */
public class Contas extends JPanel {

    JLabel descricao, valor, dataEx, tipo, letreiroReceber, letreiroPagar, totalReceber, totalPagar;
    JTextField tDescricao, tValor;
    JComboBox tTipo;
    JButton inserir, baixarConta, limpar;
    String tipos[] = {"", "Saída", "Entrada"};
    MaskFormatter mascaraData;
    JDateChooser tData;
    Calendar data;
    JTable contaReceber, contaPagar;
    JScrollPane scrollerReceber, scrollerPagar;
    Facade fa;

    public Contas(final Usuario usu) {

        JLabel tela = new JLabel("... :::   Contas a Pagar/Receber   ::: ...");
        tela.setBounds(400, 10, 500, 20);
        add(tela);

        data = Calendar.getInstance();

        letreiroReceber = new JLabel("Entradas");
        letreiroPagar = new JLabel("Saídas");
        totalReceber = new JLabel("");
        totalReceber.setForeground(Color.blue);
        totalPagar = new JLabel("");
        totalPagar.setForeground(Color.red);

        descricao = new JLabel("Descrição: ");
        tDescricao = new JTextField(100);
        valor = new JLabel("Valor: ");
        tValor = new JTextField(40);
        dataEx = new JLabel("Data: ");
        try {
            mascaraData = new MaskFormatter("##/##/####");
        } catch (ParseException ex) {
            Logger.getLogger(Contas.class.getName()).log(Level.SEVERE, null, ex);
        }
        tData = new JDateChooser();
        tipo = new JLabel("Tipo: ");
        tTipo = new JComboBox(tipos);
        baixarConta = new JButton("Baixar Conta");
        inserir = new JButton("Inserir");
        limpar = new JButton("Limpar");

        letreiroReceber.setBounds(290, 30, 200, 20);
        letreiroPagar.setBounds(290, 250, 200, 20);
        descricao.setBounds(10, 50, 100, 20);
        tDescricao.setBounds(80, 50, 200, 20);
        valor.setBounds(10, 80, 100, 20);
        tValor.setBounds(80, 80, 100, 20);
        dataEx.setBounds(10, 110, 100, 20);
        tData.setBounds(80, 110, 100, 20);
        tipo.setBounds(10, 140, 100, 20);
        tTipo.setBounds(80, 140, 200, 20);
        baixarConta.setBounds(10, 400, 200, 20);
        totalReceber.setBounds(900, 250, 100, 20);
        totalPagar.setBounds(900, 470, 100, 20);
        inserir.setBounds(20, 170, 80, 20);
        limpar.setBounds(100, 170, 80, 20);

        add(letreiroReceber);
        add(letreiroPagar);
        add(descricao);
        add(tDescricao);
        add(valor);
        add(tValor);
        add(dataEx);
        add(tData);
        add(tipo);
        add(tTipo);
        add(totalReceber);
        add(totalPagar);
        add(baixarConta);
        add(inserir);
        add(limpar);

        baixarConta.setVisible(false);
        atualizaTabelaPagar(usu);
        atualizaTabelaReceber(usu);

        if (contaPagar.getRowCount() == 1) {
            JOptionPane.showMessageDialog(null, "Nenhum registro de conta a pagar encontrado.");
        } else {
            try {

                totalPagar.setText(Funcoes.funcoes.calculaTotalFormatoDinheiro(contaPagar, 2, "0"));
            } catch (ParseException ex) {
                Logger.getLogger(Contas.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        if (contaReceber.getRowCount() == 1) {
            JOptionPane.showMessageDialog(null, "Nenhum registro de conta a receber encontrado.");
        } else {

            try {
                totalReceber.setText(Funcoes.funcoes.calculaTotalFormatoDinheiro(contaReceber, 2, "0"));
            } catch (ParseException ex) {
                Logger.getLogger(Contas.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        inserir.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                Conta conta = new Conta();
                conta.setDescricao(tDescricao.getText());
                try {
                    conta.setValor(Funcoes.funcoes.formatoParaInserir(tValor.getText()));
                } catch (ParseException ex) {

                    JOptionPane.showMessageDialog(null, "Valor inválido para o campo valor!!");

                }
                conta.setDataInclusao(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                conta.setDataExecucao(Funcoes.funcoes.paraInserirData(tData.getDate().toLocaleString().substring(0, 10)));

                if (tTipo.getSelectedIndex() == 1) {
                    conta.setTipo(ValoresFixos.TipoConta.saida.getTipo());
                } else if (tTipo.getSelectedIndex() == 2) {
                    conta.setTipo(ValoresFixos.TipoConta.entrada.getTipo());
                }
                conta.setStatus(ValoresFixos.StatusConta.aberta.getStatus());

                fa.adicionar_Conta(conta, usu);
                atualizaTabelaPagar(usu);
                atualizaTabelaReceber(usu);
                try {
                    totalPagar.setText(Funcoes.funcoes.calculaTotalFormatoDinheiro(contaPagar, 2, "0"));
                } catch (ParseException ex) {
                    Logger.getLogger(Contas.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    totalReceber.setText(Funcoes.funcoes.calculaTotalFormatoDinheiro(contaReceber, 2, "0"));
                } catch (ParseException ex) {
                    Logger.getLogger(Contas.class.getName()).log(Level.SEVERE, null, ex);
                }

                tDescricao.setText("");
                tValor.setText("");
                tTipo.setSelectedIndex(0);

            }
        });

        contaPagar.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {

                baixarConta.setVisible(true);
                contaReceber.clearSelection();

            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }
        });

        contaReceber.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {

                baixarConta.setVisible(true);
                contaPagar.clearSelection();
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }
        });

        baixarConta.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                int rowsPagar = contaPagar.getSelectedRowCount();
                int rowsReceber = contaReceber.getSelectedRowCount();
                String cod = null;
                if (rowsPagar == 0) {
                    cod = contaReceber.getValueAt(contaReceber.getSelectedRow(), 0).toString();
                }
                if (rowsReceber == 0) {
                    cod = contaPagar.getValueAt(contaPagar.getSelectedRow(), 0).toString();
                }

                int resposta = JOptionPane.showConfirmDialog(null, "Deseja realmente baixar a conta?");
                if (resposta == 0) {
                    fa = new Facade();
                    fa.baixarConta_Conta(cod,usu);
                    baixarConta.setVisible(false);
                    atualizaTabelaPagar(usu);
                    atualizaTabelaReceber(usu);
                }
            }
        });

        limpar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                tDescricao.setText("");
                tValor.setText("");
                tTipo.setSelectedIndex(0);
                baixarConta.setVisible(false);

            }
        });

        setLayout(null);
        setBackground(Color.LIGHT_GRAY);
        setBorder(BorderFactory.createBevelBorder(1, Color.DARK_GRAY, Color.DARK_GRAY));
        setSize(800, 800);
        setVisible(true);
        revalidate();
        repaint();
    }

    public final void atualizaTabelaReceber(Usuario usu) {

        try {
            remove(scrollerReceber);

        } catch (NullPointerException e) {
        }
        fa = new Facade();
        contaReceber = fa.consultarTodosReceber_Conta(usu);
        contaReceber.setForeground(Color.blue);
        contaReceber.setFont(new Font("Times New Roman", Font.BOLD, 14));
        scrollerReceber = new JScrollPane(contaReceber, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollerReceber.setBounds(285, 50, 800, 200);
        add(scrollerReceber);
    }

    public final void atualizaTabelaPagar(Usuario usu) {

        try {
            remove(scrollerPagar);

        } catch (NullPointerException e) {
        }
        fa = new Facade();
        contaPagar = fa.consultarTodosPagar_Conta(usu);
        contaPagar.setForeground(Color.red);
        contaPagar.setFont(new Font("Times New Roman", Font.BOLD, 14));
        scrollerPagar = new JScrollPane(contaPagar, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollerPagar.setBounds(285, 270, 800, 200);
        add(scrollerPagar);
    }

}
